﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Zhaoxi.CommunicationLesson
{
    public class ServiceConnect
    {
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        public bool Connect(string ip, int port)
        {
            try
            {
                socket.Connect("127.0.0.1", 9091);
                return true;
            }
            catch { return false; }
        }

        // 应答模式的方法
        public object Read(string variable, ushort count)
        {
            //variable += "|" + count.ToString();

            byte[] addrBytes = Encoding.UTF8.GetBytes(variable);// 地址字符中的Bytes数据
            byte[] countBytes = BitConverter.GetBytes(count); // 数量的Bytes数据  [2] 

            List<byte> sendBytes = new List<byte>();
            sendBytes.Add((byte)(addrBytes.Length + countBytes.Length + 1));

            sendBytes.Add(0x01);// 标记  指的是服务端接收到 这个信息后马上要返回信息

            sendBytes.AddRange(addrBytes);
            sendBytes.AddRange(countBytes);

            socket.Send(sendBytes.ToArray());




            byte[] bytes = new byte[1];
            socket.Receive(bytes, 1, SocketFlags.None);

            bytes = new byte[bytes[0]];
            socket.Receive(bytes, bytes.Length, SocketFlags.None);

            List<ushort> datas = new List<ushort>();
            for (int i = 0; i < bytes.Length; i += 2)
            {
                bytes.ToList().GetRange(i, 2);
                datas.Add(BitConverter.ToUInt16(bytes.ToList().GetRange(i, 2).ToArray()));
            }
            //var str = Encoding.UTF8.GetString(bytes);

            return datas;
        }



        public event EventHandler<object> DataReceived;
        public void Subscribe(string variable, ushort count)
        {
            byte[] addrBytes = Encoding.UTF8.GetBytes(variable);// 地址字符中的Bytes数据
            byte[] countBytes = BitConverter.GetBytes(count); // 数量的Bytes数据  [2] 

            List<byte> sendBytes = new List<byte>();
            sendBytes.Add((byte)(addrBytes.Length + countBytes.Length + 1));

            sendBytes.Add(0x02);

            sendBytes.AddRange(addrBytes);
            sendBytes.AddRange(countBytes);

            socket.Send(sendBytes.ToArray());// 将需要的订阅地址发送给服务端

            Task.Run(() =>
            {
                while (true)
                {
                    byte[] bytes = new byte[1];
                    socket.Receive(bytes, 1, SocketFlags.None);

                    bytes = new byte[bytes[0]];
                    socket.Receive(bytes, bytes.Length, SocketFlags.None);

                    List<ushort> datas = new List<ushort>();
                    for (int i = 0; i < bytes.Length; i += 2)
                    {
                        bytes.ToList().GetRange(i, 2);
                        datas.Add(BitConverter.ToUInt16(bytes.ToList().GetRange(i, 2).ToArray()));
                    }
                    // 这时候  接收到 了最新的数据

                    DataReceived?.Invoke(this, datas);
                }
            });
        }
    }
}
